#ifndef PROJECT_TASKS_H
#define PROJECT_TASKS_H

#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "event_groups.h"
#include "max30102.h"
#include "semphr.h"
#include "ble_send.h"
#include "ntp_client.h"
#include "hal_oled.h"
#include "font_oled.h"
#include "miscdev.h"


typedef enum {
    BLE_CMD_REPORT_NOW,
    BLE_CMD_BEEPER_WARNING,
    // 可以添加更多命令类型
} BleCommandType_t;

typedef struct {
    BleCommandType_t type;
    // 如果需要，可以添加更多数据，例如警告级别等
} BleCommand_t;

/* --- 全局同步原语句柄 --- */

/**
 * @brief 互斥量，用于保护对共享UART2资源的访问。
 * 所有需要通过UART2发送数据的任务在发送前必须获取此互斥量。
 */
extern SemaphoreHandle_t xUartMutex;

/**
 * @brief 队列，用于传感器数据在 Task_MAX30102_Sensor 和 Task_OLED_Display/Task_BLE_Reporter 之间传递。
 */
extern QueueHandle_t xSensorDataQueue;

/**
 * @brief 队列，用于时间数据在 Task_NTP_Sync 和 Task_OLED_Display 之间传递。
 */
extern QueueHandle_t xOledDataQueue;

/**
 * @brief 队列，用于从UART接收到的命令数据(Warning or Report)，供Task_BLE_Receiver处理。
 */
extern QueueHandle_t xBleCmdQueue;

/**
 * @brief 事件组，用于任务间异步事件通知。
 */
extern EventGroupHandle_t xBLEEventGroup;

extern EventGroupHandle_t xBLE_App_State;  // 新增: 用于通知其他任务应用层状态

/**
 * @brief 队列集，用于Task_OLED_Display/Task_BLE_Reporter同时监听多个队列和事件组。没用
 */
extern QueueSetHandle_t xQueueSet_OLED;
extern QueueSetHandle_t xReporterQueueSet;

/* --- 事件组位定义 --- */

#define BIT_BLE_CONNECTED     		( 1 << 0 ) /**< BLE已连接事件位 */
#define BIT_BLE_DISCONNECTED  		( 1 << 1 ) /**< BLE已断开事件位 */
#define BIT_FORCE_SAMPLE      		( 1 << 2 ) /**< 强制立即采样请求事件位 */
#define BIT_REPORT_NOW        		( 1 << 3 ) /**< 立即上报请求事件位 */
#define BIT_APP_BLE_DISCONNECTED	( 1 << 4 )
#define BIT_APP_BLE_CONNECTED		( 1 << 5 )
#define BIT_BLE_MTU_CONFIGURED		( 1 << 6 )

/* --- 任务函数声明 --- */

/**
 * @brief 传感器任务：负责周期性采集MAX30102数据，并响应立即采样请求。
 * 它将采集的数据打包后发送到xSensorDataQueue。
 */
void Task_MAX30102_Sensor(void *pvParameters);

/**
 * @brief 显示任务：负责从队列接收数据，并在OLED屏幕上显示。
 * 它同时监听xSensorDataQueue和xTimeQueue。
 */
void Task_OLED_Display(void *pvParameters);

/**
 * @brief 时间同步任务：负责通过AT命令与NTP服务器同步时间。
 * 它将同步到的时间发送到xTimeQueue。
 */
void Task_NTP_Sync(void *pvParameters);

/**
 * @brief 蓝牙管理任务：负责BLE模块的初始化和连接状态的恢复。
 * 它在连接断开时会重新启动广播。
 */
void Task_BLE_Manager(void *pvParameters);

/**
 * @brief 蓝牙接收任务：负责从UART接收BLE命令，并根据命令调度其他任务。
 */
void Task_BLE_Receiver(void *pvParameters);

/**
 * @brief 蓝牙上报任务：负责从队列获取数据并通过BLE上报。
 * 它响应来自Task_BLE_Receiver的立即上报请求。
 */
void Task_BLE_Reporter(void *pvParameters);

/**
 * @brief 串口处理任务：作为所有UART数据的统一处理中心。
 * 它高频次地调用串口解析函数，并根据解析结果设置事件位或发送数据到队列。
 */
void Task_UART_Daemon(void *pvParameters);

#endif
